﻿using System;
using System.Linq;
using System.Windows.Media;
using RiskMan.Config;
using RiskMan.DataClass;
using RiskMan.DataClass.Gerchik;

namespace RiskMan.Views.Robot
{
    class Sovetnik
    {
        private Data data;
        private readonly MainWindow _mainWindow;
        private static DateTime _tmpdateTime = DateTime.Now;
        private MediaPlayer player = new MediaPlayer();
        private GechikRobotItem gItemTmp;

        public void Start(GechikRobotItem grItem)
        {
            data = MainWindow.StaticLevel._dataProvider;
            gItemTmp = grItem;
            if (MainWindow.Login != "FZTC226A" && MainWindow.Login != "FZTC184A" && MainWindow.Login != "IVAN14108" && MainWindow.Login != "FZTC345A")
                return;
            //цена последней сделки
            grItem.LastPrice = data.GetLastPrice(grItem.Instrument);



            //Логика просчета свечей и определение возомжности входа в позицию
            foreach (var item in data.CandlesItems)
            {
                //Логика просчета свечей и определение возомжности входа в позицию
                int curCandle = item.Candle.Count - 1;
                int thirdCandle = item.Candle.Count - 2;
                int secondCandle = item.Candle.Count - 3;
                int firstCandle = item.Candle.Count - 4;
                if (item.Candle[curCandle].DateTime > new DateTime(2014, 10, 20) && MainWindow.Login == "FZTC345A")
                {
                    return;
                }

                if (item.Seccode == grItem.Instrument &&
                    MainWindow.DictionaryTimeFrame.FirstOrDefault(x => x.Value == grItem.TimeFrame).Key == item.Period)
                {
                    for (int i = item.Candle.Count - 2; i >= 3; i--)
                    {

                        if (item.Candle[curCandle].DateTime.Date == DateTime.Now.Date &&
                            item.Candle[i - 2].DateTime.Date == DateTime.Now.Date &&
                            item.Candle[thirdCandle].DateTime.Date == DateTime.Now.Date)
                        {

                            if (grItem.LastDateTimeCandel !=
                                new DateTime(item.Candle[curCandle].DateTime.Year, item.Candle[curCandle].DateTime.Month,
                                    item.Candle[curCandle].DateTime.Day,
                                    item.Candle[curCandle].DateTime.Hour, item.Candle[curCandle].DateTime.Minute, 0))
                            {
                                if (grItem.TimeAttemptOpenPoz.TimeOfDay != item.Candle[thirdCandle].DateTime.TimeOfDay)
                                {
                                    #region Открытие позиции

                                    if (item.Candle[curCandle].DateTime.TimeOfDay <= grItem.TimeStopLevel.TimeOfDay &&
                                        (item.Candle[curCandle].DateTime.TimeOfDay < grItem.TimeClosePoz.TimeOfDay ||
                                         grItem.TimeClosePoz.TimeOfDay == new TimeSpan(0, 0, 0)) &&
                                        item.Candle[firstCandle].DateTime.TimeOfDay >
                                        grItem.TimeStartLevel.TimeOfDay)
                                    {
                                        if (!grItem.CommentForFirstCandle)
                                        {
                                            SovetnikLog.Instance.Log(
                                                string.Format(
                                                    "Начало работы робота. Инструмент: {7}   .Время: {6}     . Время третьей свечи {0} , Low={1}, Время второй свечи {2} , Low={3}, Время первой свечи {4} , Low={5} "
                                                    , item.Candle[thirdCandle].DateTime,
                                                    item.Candle[thirdCandle].Low,
                                                    item.Candle[secondCandle].DateTime,
                                                    item.Candle[secondCandle].Low,
                                                    item.Candle[firstCandle].DateTime, item.Candle[firstCandle].Low,
                                                    item.Candle[curCandle].DateTime.TimeOfDay, grItem.Instrument));
                                            grItem.PrevCurOpen = item.Candle[curCandle].Open;

                                            grItem.CommentForFirstCandle = true;
                                        }

                                        //Открытие позиций
                                        if (_tmpdateTime.TimeOfDay + new TimeSpan(0, 0, 10) <=
                                            DateTime.Now.TimeOfDay)

                                            if (grItem.TradeList != null &&
                                                (grItem.CurPosition == 0 && grItem.TradeList.Count == 0))
                                            {
                                                #region Pattern #1

                                                //Условия для входа в лонг
                                                if (grItem.Patterns.Contains(Cfg.Pattern1Long))
                                                    if (item.Candle[thirdCandle].Low >=
                                                        item.Candle[secondCandle].Low &&
                                                        item.Candle[thirdCandle].Low <=
                                                        item.Candle[secondCandle].Low + grItem.ThirdBarDeviation &&
                                                        Math.Abs(item.Candle[secondCandle].Low -
                                                                 item.Candle[firstCandle].Low) < 0.000001)
                                                    {
                                                        SovetnikLog.Instance.Log(
                                                            string.Format(
                                                                "Условия для входа в лонг по паттерну №1. Время третьей свечи {0} , Low={1}, Время второй свечи {2} , Low={3}, Время первой свечи {4} , Low={5} "
                                                                , item.Candle[thirdCandle].DateTime,
                                                                item.Candle[thirdCandle].Low,
                                                                item.Candle[secondCandle].DateTime,
                                                                item.Candle[secondCandle].Low,
                                                                item.Candle[firstCandle].DateTime,
                                                                item.Candle[firstCandle].Low));
                                                        if (!String.IsNullOrEmpty(Properties.Settings.Default.SoundOpenPoz))
                                                            PlaySound(Properties.Settings.Default.SoundOpenPoz);
                                                        break;
                                                    }

                                                //Условия для входа в шорт
                                                if (grItem.Patterns.Contains(Cfg.Pattern1Short))
                                                    if (item.Candle[thirdCandle].High <=
                                                        item.Candle[secondCandle].High &&
                                                        item.Candle[thirdCandle].High >=
                                                        item.Candle[secondCandle].High - grItem.ThirdBarDeviation &&
                                                        Math.Abs(item.Candle[secondCandle].High -
                                                                 item.Candle[firstCandle].High) < 0.000001)
                                                    {
                                                        SovetnikLog.Instance.Log(
                                                            string.Format(
                                                                "Условия для входа в шорт по паттерну №1. Время третьей свечи {0} , High={1}, Время второй свечи {2} , High={3}, Время первой свечи {4} , High={5} "
                                                                , item.Candle[thirdCandle].DateTime,
                                                                item.Candle[thirdCandle].High,
                                                                item.Candle[secondCandle].DateTime,
                                                                item.Candle[secondCandle].High,
                                                                item.Candle[firstCandle].DateTime,
                                                                item.Candle[firstCandle].High));
                                                        if (!String.IsNullOrEmpty(Properties.Settings.Default.SoundOpenPoz))
                                                            PlaySound(Properties.Settings.Default.SoundOpenPoz);

                                                        break;
                                                    }

                                                #endregion

                                                #region Pattern #2

                                                #region Вариация №1 (2и3 отдельно от 1)

                                                //Условия для входа в лонг
                                                if (grItem.Patterns.Contains(Cfg.Pattern21Long))
                                                    if (item.Candle[i - 2].DateTime.TimeOfDay >
                                                        grItem.TimeStartLevel.TimeOfDay)
                                                        if (item.Candle[thirdCandle].Low >=
                                                            item.Candle[secondCandle].Low &&
                                                            item.Candle[thirdCandle].Low <=
                                                            item.Candle[secondCandle].Low + grItem.ThirdBarDeviation &&
                                                            Math.Abs(item.Candle[secondCandle].Low -
                                                                     item.Candle[i - 2].Low) < 0.000001)
                                                        {
                                                            SovetnikLog.Instance.Log(
                                                                string.Format(
                                                                    "Условия для входа в лонг по паттерну №2 (2и3 low отдельно от 1). Время третьей свечи {0} , Low={1}, Время второй свечи {2} , Low={3}, Время первой свечи {4} , Low={5} "
                                                                    , item.Candle[thirdCandle].DateTime,
                                                                    item.Candle[thirdCandle].Low,
                                                                    item.Candle[secondCandle].DateTime,
                                                                    item.Candle[secondCandle].Low,
                                                                    item.Candle[i - 2].DateTime,
                                                                    item.Candle[i - 2].Low));
                                                            if (!String.IsNullOrEmpty(Properties.Settings.Default.SoundOpenPoz))
                                                                PlaySound(Properties.Settings.Default.SoundOpenPoz);
                                                            break;

                                                        }

                                                //Условия для входа в шорт
                                                if (grItem.Patterns.Contains(Cfg.Pattern21Short))
                                                    if (item.Candle[i - 2].DateTime.TimeOfDay >
                                                        grItem.TimeStartLevel.TimeOfDay)
                                                        if (item.Candle[thirdCandle].High <=
                                                            item.Candle[secondCandle].High &&
                                                            item.Candle[thirdCandle].High >=
                                                            item.Candle[secondCandle].High -
                                                            grItem.ThirdBarDeviation &&
                                                            Math.Abs(item.Candle[secondCandle].High -
                                                                     item.Candle[i - 2].High) < 0.000001)
                                                        {
                                                            SovetnikLog.Instance.Log(
                                                                string.Format(
                                                                    "Условия для входа в шорт по паттерну №2 (2и3 low отдельно от 1 ). Время третьей свечи {0} , High={1}, Время второй свечи {2} , High={3}, Время первой свечи {4} , High={5} "
                                                                    , item.Candle[thirdCandle].DateTime,
                                                                    item.Candle[thirdCandle].High,
                                                                    item.Candle[secondCandle].DateTime,
                                                                    item.Candle[secondCandle].High,
                                                                    item.Candle[i - 2].DateTime,
                                                                    item.Candle[i - 2].High));
                                                            if (!String.IsNullOrEmpty(Properties.Settings.Default.SoundOpenPoz))
                                                                PlaySound(Properties.Settings.Default.SoundOpenPoz);
                                                            break;
                                                        }

                                                #endregion

                                                #region Вариация №2 (1и2 отдельно от 3)

                                                //Условия для входа в лонг
                                                if (grItem.Patterns.Contains(Cfg.Pattern22Long))
                                                    if (item.Candle[i - 2].DateTime.TimeOfDay >
                                                        grItem.TimeStartLevel.TimeOfDay)
                                                        if (
                                                            Math.Abs(item.Candle[thirdCandle].Low -
                                                                     item.Candle[i - 1].Low) < 0.000001 &&
                                                            Math.Abs(item.Candle[i - 1].Low - item.Candle[i - 2].Low) <
                                                            0.000001)
                                                        {
                                                            SovetnikLog.Instance.Log(
                                                                string.Format(
                                                                    "Условия для входа в лонг по паттерну №2 (1и2 отдельно от 3). Время третьей свечи {0} , Low={1}, Время второй свечи {2} , Low={3}, Время первой свечи {4} , Low={5} "
                                                                    , item.Candle[thirdCandle].DateTime,
                                                                    item.Candle[thirdCandle].Low,
                                                                    item.Candle[i - 1].DateTime,
                                                                    item.Candle[i - 1].Low,
                                                                    item.Candle[i - 2].DateTime,
                                                                    item.Candle[i - 2].Low));
                                                            if (!String.IsNullOrEmpty(Properties.Settings.Default.SoundOpenPoz))
                                                                PlaySound(Properties.Settings.Default.SoundOpenPoz);
                                                            break;
                                                        }

                                                //Условия для входа в шорт
                                                if (grItem.Patterns.Contains(Cfg.Pattern22Short))
                                                    if (item.Candle[i - 2].DateTime.TimeOfDay >
                                                        grItem.TimeStartLevel.TimeOfDay)
                                                        if (
                                                            Math.Abs(item.Candle[thirdCandle].High -
                                                                     item.Candle[i - 1].High) < 0.000001 &&
                                                            Math.Abs(item.Candle[i - 1].High -
                                                                     item.Candle[i - 2].High) < 0.000001)
                                                        {
                                                            SovetnikLog.Instance.Log(
                                                                string.Format(
                                                                    "Условия для входа в шорт по паттерну №2 (1и2 отдельно от 3 ). Время третьей свечи {0} , High={1}, Время второй свечи {2} , High={3}, Время первой свечи {4} , High={5} "
                                                                    , item.Candle[thirdCandle].DateTime,
                                                                    item.Candle[thirdCandle].High,
                                                                    item.Candle[i - 1].DateTime,
                                                                    item.Candle[i - 1].High,
                                                                    item.Candle[i - 2].DateTime,
                                                                    item.Candle[i - 2].High));
                                                            if (!String.IsNullOrEmpty(Properties.Settings.Default.SoundOpenPoz))
                                                                PlaySound(Properties.Settings.Default.SoundOpenPoz);
                                                            break;
                                                        }

                                                #endregion

                                                #endregion

                                                #region Pattern #3

                                                #region Вариация №1 (1 high 2 low 3 low вместе)

                                                //Условия для входа в лонг
                                                if (grItem.Patterns.Contains(Cfg.Pattern31Long))
                                                    if (item.Candle[thirdCandle].Low >=
                                                        item.Candle[secondCandle].Low &&
                                                        item.Candle[thirdCandle].Low <=
                                                        item.Candle[secondCandle].Low + grItem.ThirdBarDeviation &&
                                                        Math.Abs(item.Candle[secondCandle].Low -
                                                                 item.Candle[firstCandle].High) < 0.000001)
                                                    {
                                                        SovetnikLog.Instance.Log(
                                                            string.Format(
                                                                "Условия для входа в лонг по паттерну №3 (1 high 2 low 3 low вместе). Время третьей свечи {0} , Low={1}, Время второй свечи {2} , Low={3}, Время первой свечи {4} , Hgih={5} "
                                                                , item.Candle[thirdCandle].DateTime,
                                                                item.Candle[thirdCandle].Low,
                                                                item.Candle[secondCandle].DateTime,
                                                                item.Candle[secondCandle].Low,
                                                                item.Candle[firstCandle].DateTime,
                                                                item.Candle[firstCandle].High));
                                                        if (!String.IsNullOrEmpty(Properties.Settings.Default.SoundOpenPoz))
                                                            PlaySound(Properties.Settings.Default.SoundOpenPoz);
                                                        break;
                                                    }

                                                //Условия для входа в шорт
                                                if (grItem.Patterns.Contains(Cfg.Pattern31Short))
                                                    if (item.Candle[thirdCandle].High <=
                                                        item.Candle[secondCandle].High &&
                                                        item.Candle[thirdCandle].High >=
                                                        item.Candle[secondCandle].High - grItem.ThirdBarDeviation &&
                                                        Math.Abs(item.Candle[secondCandle].High -
                                                                 item.Candle[firstCandle].Low) < 0.000001)
                                                    {
                                                        SovetnikLog.Instance.Log(
                                                            string.Format(
                                                                "Условия для входа в шорт по паттерну №3 (1 low 2 High 3 High вместе). Время третьей свечи {0} , High={1}, Время второй свечи {2} , High={3}, Время первой свечи {4} , Low={5} "
                                                                , item.Candle[thirdCandle].DateTime,
                                                                item.Candle[thirdCandle].High,
                                                                item.Candle[secondCandle].DateTime,
                                                                item.Candle[secondCandle].High,
                                                                item.Candle[firstCandle].DateTime,
                                                                item.Candle[firstCandle].Low));
                                                        if (!String.IsNullOrEmpty(Properties.Settings.Default.SoundOpenPoz))
                                                            PlaySound(Properties.Settings.Default.SoundOpenPoz);
                                                        break;

                                                    }

                                                #endregion


                                                #region Вариация №3 (2и3 low отдельно от 1 high)

                                                //Условия для входа в лонг
                                                if (grItem.Patterns.Contains(Cfg.Pattern32Long))
                                                    if (item.Candle[i - 2].DateTime.TimeOfDay >
                                                        grItem.TimeStartLevel.TimeOfDay)
                                                        if (item.Candle[thirdCandle].Low >=
                                                            item.Candle[secondCandle].Low &&
                                                            item.Candle[thirdCandle].Low <=
                                                            item.Candle[secondCandle].Low + grItem.ThirdBarDeviation &&
                                                            Math.Abs(item.Candle[secondCandle].Low -
                                                                     item.Candle[i - 2].High) < 0.000001)
                                                        {
                                                            SovetnikLog.Instance.Log(
                                                                string.Format(
                                                                    "Условия для входа в лонг по паттерну №3 (2и3 low отдельно от 1 high). Время третьей свечи {0} , Low={1}, Время второй свечи {2} , Low={3}, Время первой свечи {4} , Hgih={5} "
                                                                    , item.Candle[thirdCandle].DateTime,
                                                                    item.Candle[thirdCandle].Low,
                                                                    item.Candle[secondCandle].DateTime,
                                                                    item.Candle[secondCandle].Low,
                                                                    item.Candle[i - 2].DateTime,
                                                                    item.Candle[i - 2].High));
                                                            if (!String.IsNullOrEmpty(Properties.Settings.Default.SoundOpenPoz))
                                                                PlaySound(Properties.Settings.Default.SoundOpenPoz);
                                                            break;

                                                        }

                                                //Условия для входа в шорт
                                                if (grItem.Patterns.Contains(Cfg.Pattern32Short))
                                                    if (item.Candle[i - 2].DateTime.TimeOfDay >
                                                        grItem.TimeStartLevel.TimeOfDay)
                                                        if (item.Candle[thirdCandle].High <=
                                                            item.Candle[secondCandle].High &&
                                                            item.Candle[thirdCandle].High >=
                                                            item.Candle[secondCandle].High -
                                                            grItem.ThirdBarDeviation &&
                                                            Math.Abs(item.Candle[secondCandle].High -
                                                                     item.Candle[i - 2].Low) < 0.000001)
                                                        {
                                                            SovetnikLog.Instance.Log(
                                                                string.Format(
                                                                    "Условия для входа в шорт по паттерну №3 (2и3 High отдельно от 1 Low). Время третьей свечи {0} , High={1}, Время второй свечи {2} , High={3}, Время первой свечи {4} , Low={5} "
                                                                    , item.Candle[thirdCandle].DateTime,
                                                                    item.Candle[thirdCandle].High,
                                                                    item.Candle[secondCandle].DateTime,
                                                                    item.Candle[secondCandle].High,
                                                                    item.Candle[i - 2].DateTime,
                                                                    item.Candle[i - 2].Low));
                                                            if (!String.IsNullOrEmpty(Properties.Settings.Default.SoundOpenPoz))
                                                                PlaySound(Properties.Settings.Default.SoundOpenPoz);
                                                            break;
                                                        }

                                                #endregion

                                                #endregion
                                            }
                                    }

                                    #endregion
                                }

                            }
                        }
                    }

                    grItem.LastDateTimeCandel = new DateTime(item.Candle[curCandle].DateTime.Year,
                    item.Candle[curCandle].DateTime.Month, item.Candle[curCandle].DateTime.Day,
                    item.Candle[curCandle].DateTime.Hour, item.Candle[curCandle].DateTime.Minute, 0);
                }
            }


        }

        /// <summary>
        /// Проигрывание музыки при совершении действия
        /// </summary>
        /// <param name="PathSound"></param>
        private void PlaySound(string PathSound)
        {
            if (gItemTmp.SoundAlert)
            {
                player.Stop();
                player.Open(new Uri(PathSound, UriKind.Relative));
                player.Play();
            }
        }

    }
}
